iT邦幫忙

2024 iThome 鐵人賽

DAY 8
0
AI/ ML & Data

基於人工智慧與深度學習對斑馬魚做行為分析系列 第 8

day 8 Lstm 預測奧運運動隊伍奪冠率

  • 分享至 

  • xImage
  •  

今天是第八天剛好奧運如火如荼正在進行,因此我想寫一個Lstm去預測我喜歡的隊伍的奪冠率,以下是程式碼

import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense, Dropout

# 假設我們有一個包含歷史比賽數據的DataFrame
# 比如: year, team, opponent, score, opponent_score, win, ... 等等
data = pd.read_csv('olympic_team_data.csv')

# 先做資料預處理,將字串類資料轉換成數字類資料
data['team'] = pd.Categorical(data['team']).codes
data['opponent'] = pd.Categorical(data['opponent']).codes

# 選擇我們感興趣的特徵和標籤
features = data[['year', 'team', 'opponent', 'score', 'opponent_score']]
labels = data['win']  # 假設 'win' 表示是否奪冠 (1 表示奪冠, 0 表示未奪冠)

# 將資料正規化
scaler = MinMaxScaler()
features_scaled = scaler.fit_transform(features)

# 將資料轉換成LSTM所需的三維輸入 (samples, timesteps, features)
X = []
y = []

timesteps = 10  # 設置LSTM時間步長

for i in range(timesteps, len(features_scaled)):
    X.append(features_scaled[i-timesteps:i])
    y.append(labels.iloc[i])

X, y = np.array(X), np.array(y)

# 分割訓練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 建立LSTM模型
model = Sequential()
model.add(LSTM(units=50, return_sequences=True, input_shape=(X_train.shape[1], X_train.shape[2])))
model.add(Dropout(0.2))
model.add(LSTM(units=50, return_sequences=False))
model.add(Dropout(0.2))
model.add(Dense(units=25, activation='relu'))
model.add(Dense(units=1, activation='sigmoid'))

# 編譯模型
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])

# 訓練模型
model.fit(X_train, y_train, epochs=50, batch_size=32, validation_data=(X_test, y_test))

# 評估模型
loss, accuracy = model.evaluate(X_test, y_test)
print(f"模型準確率: {accuracy * 100:.2f}%")

# 預測奪冠率
predictions = model.predict(X_test)
predictions = (predictions > 0.5).astype(int)

1. 導入必要的庫

import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense, Dropout
  • numpypandas: 用來處理和操作數據。
  • train_test_split: 來自 sklearn,用於將數據分割成訓練集和測試集。
  • MinMaxScaler: 用於將數據正規化,使所有特徵的值在同一範圍內(通常是 0 到 1)。
  • tensorflow.keras: 用於建立和訓練深度學習模型,其中包含 Sequential 模型(層按順序堆疊)和 LSTM 層等。

2. 加載數據並進行預處理

data = pd.read_csv('olympic_team_data.csv')

這裡我們假設你有一個 CSV 檔案 olympic_team_data.csv,其中包含運動隊伍的歷史比賽數據。

data['team'] = pd.Categorical(data['team']).codes
data['opponent'] = pd.Categorical(data['opponent']).codes
  • pd.Categorical().codes: 這裡將字串類型的隊伍名稱(teamopponent)轉換成數字編碼,因為 LSTM 模型無法直接處理字串類型的數據。

3. 選擇特徵和標籤

features = data[['year', 'team', 'opponent', 'score', 'opponent_score']]
labels = data['win']  # 假設 'win' 表示是否奪冠 (1 表示奪冠, 0 表示未奪冠)
  • features: 模型輸入的數據特徵,包括年份、隊伍、對手、比分等。
  • labels: 模型的標籤,也就是我們要預測的目標,這裡是 win,表示隊伍是否奪冠。

4. 數據正規化

scaler = MinMaxScaler()
features_scaled = scaler.fit_transform(features)
  • MinMaxScaler: 將所有特徵縮放到 0 到 1 的範圍內,這有助於加速模型的訓練並提高模型的性能。

5. 準備 LSTM 模型的輸入數據

X = []
y = []

timesteps = 10  # 設置LSTM時間步長

for i in range(timesteps, len(features_scaled)):
    X.append(features_scaled[i-timesteps:i])
    y.append(labels.iloc[i])

X, y = np.array(X), np.array(y)
  • timesteps: 指定 LSTM 每次觀察數據的時間步長,這裡設為 10。也就是說,模型將觀察過去 10 條記錄來預測下一個結果。
  • Xy: X 是 LSTM 的輸入特徵,y 是對應的標籤(是否奪冠)。這裡我們使用一個循環來創建 Xy,其中 X 是一個三維數據(samples, timesteps, features),而 y 是一維的標籤。

6. 分割訓練集和測試集

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
  • train_test_split: 將數據集分成訓練集(80%)和測試集(20%),這樣我們可以訓練模型並檢驗其在未見過的數據上的表現。
  • random_state: 設定隨機種子,保證每次分割結果相同。

7. 建立 LSTM 模型

model = Sequential()
model.add(LSTM(units=50, return_sequences=True, input_shape=(X_train.shape[1], X_train.shape[2])))
model.add(Dropout(0.2))
model.add(LSTM(units=50, return_sequences=False))
model.add(Dropout(0.2))
model.add(Dense(units=25, activation='relu'))
model.add(Dense(units=1, activation='sigmoid'))
  • Sequential: 表示模型是線性堆疊的層次結構。
  • LSTM: 長短期記憶網絡層。units=50 表示該層有 50 個記憶單元。return_sequences=True 表示該層會返回完整的序列(適合堆疊多層 LSTM),而 return_sequences=False 表示只返回最後一個時間步長的輸出。
  • Dropout: 用於防止過擬合,隨機將一部分神經元的輸出設為 0。
  • Dense: 全連接層。第一個 Dense 層有 25 個神經元,使用 ReLU 激活函數;最後一個 Dense 層有 1 個神經元,使用 Sigmoid 激活函數,輸出值範圍在 0 到 1 之間,適合二元分類問題。

8. 編譯模型

model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
  • optimizer='adam': 使用 Adam 優化器來更新模型權重。
  • loss='binary_crossentropy': 使用二元交叉熵作為損失函數,適合二分類問題。
  • metrics=['accuracy']: 在訓練和測試過程中會顯示準確率。

9. 訓練模型

model.fit(X_train, y_train, epochs=50, batch_size=32, validation_data=(X_test, y_test))
  • epochs=50: 模型將遍歷訓練數據 50 次。
  • batch_size=32: 每次使用 32 條數據來更新模型權重。
  • validation_data: 在每一個 epoch 結束後使用測試集來評估模型。

10. 評估模型

loss, accuracy = model.evaluate(X_test, y_test)
print(f"模型準確率: {accuracy * 100:.2f}%")
  • model.evaluate: 使用測試集來評估模型的損失和準確率。

11. 預測奪冠率

predictions = model.predict(X_test)
predictions = (predictions > 0.5).astype(int)
  • model.predict: 使用測試集進行預測,結果是 0 到 1 之間的機率值。
  • (predictions > 0.5).astype(int): 將機率值轉換為二元結果(大於 0.5 視為奪冠,即 1;否則為 0)。

總結

這個 LSTM 模型是為了解析過去的數據並預測未來奧運隊伍是否奪冠的概率。當然,模型的效果會受到訓練數據質量和特徵選擇的影響,模型本身也可以進一步優化,比如調整 LSTM 層數或神經元數量。


上一篇
day 7 yolo v8 模擬特斯拉辨識系統
下一篇
Day 9Lstm預測兩隻斑馬魚行為分析
系列文
基於人工智慧與深度學習對斑馬魚做行為分析30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言